package cn.itcast.web.controller.system;

import cn.itcast.domain.system.Dept;
import cn.itcast.domain.system.Role;
import cn.itcast.domain.system.User;
import cn.itcast.service.system.DeptService;
import cn.itcast.service.system.RoleService;
import cn.itcast.service.system.UserService;
import cn.itcast.web.controller.BaseController;
import com.github.pagehelper.PageInfo;
import lombok.extern.slf4j.Slf4j;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Controller
@RequestMapping("/system/user")
@Slf4j
public class UserController extends BaseController{

    @Autowired
    private UserService userService;
    @Autowired
    private DeptService deptService;

    // 记录日志的工具类
    //private Log log = LogFactory.getLog(UserController.class);

    /**
     * 查询列表
     */
    @RequestMapping("/list")
    @RequiresPermissions("用户管理")
    public String list(
            @RequestParam(defaultValue = "1") Integer pageNum,
            @RequestParam(defaultValue = "5") Integer pageSize) {
        log.info("执行用户分页的方法");

        // 权限校验
        //SecurityUtils.getSubject().checkPermission("指定访问资源需要的权限");
        //SecurityUtils.getSubject().checkPermission("用户管理");

        // 企业id，从当前登陆用户哪里获取（先写死）
        String companyId = getLoginCompanyId();
        // 调用service查询
        PageInfo<User> pageInfo =
                userService.findByPage(companyId, pageNum, pageSize);
        // 存储查询结果
        request.setAttribute("pageInfo", pageInfo);

        return "system/user/user-list";
    }

    /**
     * 进入添加页面
     */
    @RequestMapping("/toAdd")
    public String toAdd() {
        // 查询所有部门
        List<Dept> deptList = deptService.findAll(getLoginCompanyId());
        request.setAttribute("deptList", deptList);
        return "system/user/user-add";
    }

    @Autowired
    private RabbitTemplate rabbitTemplate;

    /**
     * 添加、修改
     */
    @RequestMapping("/edit")
    public String edit(User user) {
        // 设置企业信息（先写死，后期从登陆用户动态获取）
        user.setCompanyId(getLoginCompanyId());
        user.setCompanyName(getLoginCompanyName());
        // 判断
        if (StringUtils.isEmpty(user.getId())) {
            log.info("添加用户....");
            userService.save(user);

            /* 发送邮件，通过RabbitTemplate实现消息的发送. 邮件发送，交给消息处理系统*/
            Map<String,String> map = new HashMap<>();
            map.put("email",user.getEmail());
            map.put("title","新员工入职提醒邮件");
            map.put("content","欢迎来到SaasExport大家庭，我们是一支有激情的团队！");
            // 发送消息
            rabbitTemplate.convertAndSend("myExchange","msg.email",map);
        } else {
            log.info("修改用户....");
            userService.update(user);
        }
        return "redirect:/system/user/list";
    }

    /**
     * 进入修改页面
     * 1. 根据id查询，回显信息
     * 2. 查询所有，作为上级下拉列表
     */
    @RequestMapping("/toUpdate")
    public String toUpdate(String id) {
        // 根据id查询
        User user = userService.findById(id);

        // 查询所有部门
        List<Dept> deptList = deptService.findAll(getLoginCompanyId());

        // 保存
        request.setAttribute("user", user);
        request.setAttribute("deptList", deptList);
        return "system/user/user-update";
    }

    /**
     * 删除
     * 返回的数据：{message:1}
     */
    @RequestMapping("/delete")
    @ResponseBody  // 返回json字符串
    public Map<String, Integer> delete(String id) {
        Map<String, Integer> result = new HashMap<>();

        // 调用service删除
        boolean flag = userService.delete(id);
        if (flag) {
            // 删除成功
            result.put("message", 1);
        } else {
            // 删除失败
            result.put("message", 0);
        }
        return result;
    }

    @Autowired
    private RoleService roleService;
    /**
     * 用户分配角色（1） 进入用户分配角色页面
     * 功能入口： user-list.jsp用户列表点击“角色”
     * 请求地址： /system/user/roleList
     * 请求参数： id 用户id
     * 响应地址： system/user/user-role.jsp
     */
    @RequestMapping("/roleList")
    public String roleList(String id) {
        //1. 根据用户id查询
        User user = userService.findById(id);

        //2. 查询所有角色
        List<Role> roleList = roleService.findAll(getLoginCompanyId());

        //3. 查询用户已经拥有的角色（为了user-role.jsp页面的复选框选中）
        List<Role> userRoleList = roleService.findUserRoleByUserId(id);
        // 定义角色字符串，存储用户已经拥有的所有角色id，用逗号隔开
        String userRoleIds = "";//1,2,3,
        if (userRoleList != null) {
            for (Role role : userRoleList) {
                userRoleIds += role.getId() + ",";
            }
        }
        //4. 保存结果
        request.setAttribute("user",user);
        request.setAttribute("roleList",roleList);
        request.setAttribute("userRoleIds",userRoleIds);
        return "system/user/user-role";

    }


    /**
     * 用户分配角色（2） 用户分配角色
     * 请求参数：
     *    userId  用户id
     *    roleIds 选中的角色id，有多个角色id; 可以用数组接收、或者字符串接收（自动逗号分割）
     */
    @RequestMapping("/changeRole")
    public String changeRole(String userId,String[] roleIds) {
        // 用户分配角色
        userService.changeRole(userId,roleIds);
        // 重定向到用户列表
        return "redirect:/system/user/list";
    }

}
